/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo.DAL;

import Modelo.PreReporte;
import Modelo.ComunidadUniversitaria;
import Modelo.PreReporteFetch;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import org.json.JSONObject;
import java.util.List;
import java.util.ArrayList;
import org.json.JSONArray;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 *
 * @author miguel474
 */
public class PreReporte_DAO {

    public static boolean insertarPreReporte(PreReporte pr) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Insertando PreReporte!");
            return false;
        }
        String query = "INSERT INTO pre_reporte(id_pre_reporte,ingresa, descripcion, ubicacion, nombre_sede, fecha_suceso, fecha_pr)"
                + "VALUES (nextval('id_pr_seq'),'"
                + pr.getIngresa()
                + "','" + pr.getDescripcion()
                + "','" + pr.getUbicacion()
                + "','" + pr.getNombreSede()
                + "','" + pr.getFechaSuceso()
                + "','" + pr.getFechaPr() + "')";
        System.out.println("\n\tQuery: " + query + "\n");
        System.out.println(query);
        try {
            s.executeUpdate(query);
            conexion.cerrarConexion();
            return true;
        } catch (SQLException se) {
            System.out.println("Error Insertando Pre-Reporte!");
            conexion.cerrarConexion();
            return false;
        }
    }

    public static boolean actualizarPreReporte(PreReporte pr) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;

        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Modificando PreReporte!");
            return false;
        }

        String query = "UPDATE pre_reporte set ";
        query += " ingresa ='" + pr.getIngresa() + "',";
        // query += " ubicacion ='" + pr.getUbicacion() + "',";
        query += " descripcion ='" + pr.getDescripcion() + "'";
        query += " where id_pre_reporte = " + pr.getPreReporte() + " ;";

        System.out.println("\n***query " + query);

        try {
            s.executeUpdate(query);
            return true;
        } catch (SQLException se) {
            System.out.println("Error Modificando Pre-Reporte!");
            return false;
        }
    }

    public static JSONObject consultarPreReportes(PreReporte pr, ComunidadUniversitaria cu1, ComunidadUniversitaria cu2, String limit, String offset, String order, String asc) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        JSONObject preRs = new JSONObject();
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("¡Error Consultando PreReporte!");
            return null;
        }
        try {
            String query = "select "
                    + "p.id_pre_reporte,c1.ci,c1.nombre_1,c1.apellido_1, "
                    + "p.fecha_pr, c2.ci, c2.nombre_1, c2.apellido_1, "
                    + "p.ubicacion, (select count(*) from pre_reporte) "
                    + "from pre_reporte p, comunidad_universitaria c1, "
                    + "denuncia d, personal_dsi t, comunidad_universitaria c2 ";
            String params = "where "
                    + "p.id_pre_reporte = d.id_pre_reporte and "
                    + "p.ingresa = t.ci and d.ci = c1.ci and t.ci = c2.ci ";

            String ci_den = cu1.getCi();
            String nombre_den = cu1.getNombre1();
            String apellido_den = cu1.getApellido1();
            String nombre_rec = cu2.getNombre1();
            String apellido_rec = cu2.getApellido2();
            String ubicacion = pr.getUbicacion();


            if (ci_den != null && !ci_den.equals("")) {
                params += " and lower(c1.ci) like lower('%" + ci_den + "%')";
            }

            if (nombre_den != null && !nombre_den.equals("")) {
                params += " and lower(c1.nombre_1) like lower('%" + nombre_den + "%')";
            }

            if (apellido_den != null && !apellido_den.equals("")) {
                params += " and lower(c1.apellido_1) like lower('%" + apellido_den + "%')";
            }

            if (nombre_rec != null && !nombre_rec.equals("")) {
                params += " and lower(c2.nombre_1) like lower('%" + nombre_rec + "%')";
            }

            if (apellido_rec != null && !apellido_rec.equals("")) {
                params += " and lower(c1.apellido_1) like lower('%" + apellido_rec + "%')";
            }

            if (ubicacion != null && !ubicacion.equals("")) {
                params += " and lower(p.ubicacion) like lower('%" + ubicacion + "%')";
            }

            String format = "";
            if (order != null && !order.equals("")) {
                format += " order by " + order;
                if (asc != null && !asc.equals("") && asc.equals("false")) {
                    format += " desc";
                } else {
                    format += " asc";
                }
            }

            if (limit != null && !limit.equals("")) {
                format += " limit " + limit;
            }
            if (offset != null && !offset.equals("")) {
                format += " offset " + offset;
            }

            System.out.println(query + params + format);
            rs = s.executeQuery(query + params + format);
            JSONArray preReportes = new JSONArray();



            int i = 0;
            while (rs.next()) {
                JSONObject preReporte = new JSONObject();
                System.out.println("... ID_PR ... : "+rs.getString(1));
                preReporte.put("id_pre_reporte", rs.getString(1));
                preReporte.put("ci_den", rs.getString(2));
                preReporte.put("nombre_den", rs.getString(3));
                preReporte.put("apellido_den", rs.getString(4));
                preReporte.put("fecha", rs.getString(5));
                preReporte.put("ci_rec", rs.getString(6));
                preReporte.put("nombre_rec", rs.getString(7));
                preReporte.put("apellido_rec", rs.getString(8));
                preReporte.put("ubicacion", rs.getString(9));
                preReporte.put("tam", rs.getInt(10));
                preReportes.put(i++, preReporte);
            }

            query = "select "
                    + "count(*) "
                    + "from pre_reporte p, comunidad_universitaria c1, "
                    + "denuncia d, personal_dsi t, comunidad_universitaria c2 "
                    + params;

            System.out.println(query + params);
            rs = s.executeQuery(query);

            preRs.put("preReportes", preReportes);
            if (rs.next()) {
                preRs.put("tam", rs.getString(1));
            }

            return preRs;
        } catch (SQLException se) {
            System.out.println("Error Consultado el Pre-Reporte\n" + se.getMessage());
            return null;
        } catch (Exception e) {
            System.out.println("Error obteniendo data del Pre-Reporte\n" + e.getMessage());
            return null;
        }
    }

    public static JSONObject getPR(String idPreReporte) {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("¡Error Consultando Pre-Reporte!");
            return null;
        }
        try {
            String query = "select "
                    + "p.id_pre_reporte,c1.ci,c1.nombre_1,c1.apellido_1, "
                    + "c1.telefono, p.fecha_suceso, c2.ci, p.ubicacion, "
                    + "p.descripcion, p.nombre_sede, c2.nombre_1, c2.apellido_1 "
                    + "from pre_reporte p, comunidad_universitaria c1, "
                    + "denuncia d, personal_dsi t, comunidad_universitaria c2 "
                    + "where p.id_pre_reporte = '" + idPreReporte + "' and "
                    + "p.id_pre_reporte = d.id_pre_reporte and "
                    + "p.ingresa = t.ci and d.ci = c1.ci and t.ci = c2.ci";

            System.out.println(query);
            rs = s.executeQuery(query);
            JSONObject preReporte = new JSONObject();
            try {
                int i = 0;
                while (rs.next()) {
                    preReporte.put("idPreReporte", rs.getString(1));
                    System.out.println("1) " + preReporte + " " + rs.getString(1) + "\n");
                    String[] cedula = rs.getString(2).split("-");
                    preReporte.put("nac", cedula[0]);
                    preReporte.put("ci", cedula[1]);
                    preReporte.put("nombre_den", rs.getString(3));
                    preReporte.put("apellido_den", rs.getString(4));
                    preReporte.put("telefono", rs.getString(5));
                    preReporte.put("fecha", rs.getString(6));
                    preReporte.put("worker", rs.getString(7));
                    preReporte.put("ubicacion", rs.getString(8));
                    preReporte.put("descripcion", rs.getString(9));
                    preReporte.put("sede", rs.getString(10));
                    preReporte.put("nombre_rec", rs.getString(11));
                    preReporte.put("apellido_rec", rs.getString(12));
                }
            } catch (Exception e) {
                System.out.println("Error obteniendo data del Pre-Reporte." + e.getMessage());
            }
            return preReporte;
        } catch (SQLException se) {
            System.out.println("Error Consultado el Pre-Reporte" + se.getMessage());
            return null;
        }
    }

    public static List<PreReporteFetch> consultarPreReporte() {
        ConexionBD conexion = new ConexionBD();
        Statement s = null;
        ResultSet rs = null;
        try {
            s = conexion.session.createStatement();
        } catch (SQLException se) {
            System.out.println("Error Consultando un Sede!");
            return null;
        }
        String query = "select "
                + "p.id_pre_reporte,p.fecha_pr,p.fecha_suceso,c.ci,c.nombre_1,"
                + "c.apellido_1,p.ingresa,p.ubicacion "
                + "from pre_reporte p,comunidad_universitaria c,denuncia d "
                + "where p.id_pre_reporte = d.id_pre_reporte and c.ci = d.ci "
                + "order by fecha_pr desc";
        System.out.println("\n\t->Query: " + query + "\n");
        System.out.println(query);
        List<PreReporteFetch> listaPR = new ArrayList<PreReporteFetch>();
        try {
            rs = s.executeQuery(query);
            System.out.println("+++++++\n\n" + rs);


            /*
            Se recorre cada fila del ResultSet para instancia a cada empleado y agregarlo a la lista de empleados.
             */
            while (rs.next()) {
                /* Se instancia del nuevo pre-reporte. */
                PreReporteFetch temp = new PreReporteFetch(rs.getString("id_pre_reporte"), rs.getString("fecha_pr"), rs.getString("fecha_suceso"), rs.getString("ci"), rs.getString("nombre_1"), rs.getString("apellido_1"), rs.getString("ingresa"), rs.getString("ubicacion"));
                //PreReporteFetch temp = new PreReporteFetch(
                /* Se agrega el pre-reporte a la lista. */
                listaPR.add(temp);
            }
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("Error Consultado el extintor");
            return null;
        } finally {
            conexion.cerrarConexion();
        }
        //return listaSedes.toArray(new Sede[listaSedes.size()]);
        return listaPR;
    }

    public byte[] generarPreReporte(Map parametros) {
        ConexionBD conexion = new ConexionBD();
        byte[] pdf = null;
        String filename = "/Modulo1/preReporte.jasper";
        JasperReport masterReport = null;
        try {
            masterReport = (JasperReport) JRLoader.loadObject(getClass().getResource(filename));
            pdf = JasperRunManager.runReportToPdf(masterReport, parametros, conexion.session);
        } catch (JRException e) {
            e.printStackTrace();
        }
        if (conexion.session != null) {
            conexion.cerrarConexion();
        }

        return pdf;
    }
}
